package com.docmgmt.mvp.ragflow.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

/**
 * 对话会话列表 VO
 * 
 * 用于接收 RAGFlow 的 GET /api/v1/chats/{chat_id}/sessions 接口返回结果。
 * 
 * 包含会话列表和总数信息，支持分页查询。
 * 
 * 使用示例：
 * <pre>
 * SessionListVO sessionList = ragflowClient.listSessions(chatId);
 * System.out.println("会话总数：" + sessionList.getTotal());
 * 
 * for (SessionVO session : sessionList.getSessions()) {
 *     System.out.println("会话名称：" + session.getName());
 *     System.out.println("消息数量：" + session.getMessageCount());
 * }
 * </pre>
 * 
 * @author Dora
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SessionListVO {

    /**
     * 会话列表
     * 
     * 包含当前页的所有会话详情。
     * 
     * 排序规则（默认）：
     * - 按更新时间降序排序（最近活跃的在前）
     * - 可以通过 API 参数自定义排序规则
     * 
     * 特点：
     * - 如果没有会话，返回空列表（不是 null）
     * - 每个会话包含完整的详情信息
     * - 列表长度受分页参数控制
     * 
     * 注意：
     * - 列表中的会话都属于同一个 Chat Assistant
     * - 已删除的会话不会出现在列表中
     */
    @Builder.Default
    private List<SessionVO> sessions = new ArrayList<>();

    /**
     * 会话总数
     * 
     * 该 Chat Assistant 的会话总数（不受分页影响）。
     * 
     * 用途：
     * - 计算总页数：total / page_size
     * - 显示"共 X 个会话"
     * - 判断是否还有更多会话
     * 
     * 注意：
     * - 此数字包含所有会话，不仅是当前页
     * - 如果没有会话，total = 0
     */
    @Builder.Default
    private Integer total = 0;

    // ==================== 辅助方法 ====================

    /**
     * 判断是否为空列表
     * 
     * @return 是否为空
     */
    public boolean isEmpty() {
        return sessions == null || sessions.isEmpty();
    }

    /**
     * 获取会话数量（当前页）
     * 
     * @return 当前页的会话数量
     */
    public int getSize() {
        return sessions != null ? sessions.size() : 0;
    }

    /**
     * 添加会话到列表
     * 
     * @param session 会话对象
     */
    public void addSession(SessionVO session) {
        if (sessions == null) {
            sessions = new ArrayList<>();
        }
        sessions.add(session);
    }

    /**
     * 根据 ID 查找会话
     * 
     * @param sessionId 会话 ID
     * @return 会话对象，如果不存在返回 null
     */
    public SessionVO findById(String sessionId) {
        if (sessions == null || sessionId == null) {
            return null;
        }
        return sessions.stream()
                .filter(s -> sessionId.equals(s.getId()))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据名称查找会话（模糊匹配）
     * 
     * @param keyword 关键词
     * @return 匹配的会话列表
     */
    public List<SessionVO> findByName(String keyword) {
        if (sessions == null || keyword == null || keyword.trim().isEmpty()) {
            return new ArrayList<>();
        }
        String lowerKeyword = keyword.toLowerCase();
        return sessions.stream()
                .filter(s -> s.getName() != null && 
                            s.getName().toLowerCase().contains(lowerKeyword))
                .toList();
    }

    /**
     * 获取活跃会话（有消息的会话）
     * 
     * @return 活跃会话列表
     */
    public List<SessionVO> getActiveSessions() {
        if (sessions == null) {
            return new ArrayList<>();
        }
        return sessions.stream()
                .filter(s -> !s.isEmpty())
                .toList();
    }

    /**
     * 获取空会话（没有消息的会话）
     * 
     * @return 空会话列表
     */
    public List<SessionVO> getEmptySessions() {
        if (sessions == null) {
            return new ArrayList<>();
        }
        return sessions.stream()
                .filter(SessionVO::isEmpty)
                .toList();
    }
}

